﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Comsenz.Base;
using Lbb.Web;

namespace Comsenz.Discuz
{
    /// <summary>
    /// Discuz角色管理器
    /// </summary>
    /// <author>Chiron</author>
    public static class DiscuzRoleManager
    {
        /// <summary>
        /// 通讯器
        /// </summary>
        private readonly static CommunicatorBase communicator = new DiscuzApiCommunicator();
        /// <summary>
        /// 执行操作
        /// </summary>
        private static string Do(string action, IEnumerable<QueryParameter> args = null, IEnumerable<QueryParameter> extArgs = null)
        {
            return communicator.Do("roles", action, args, extArgs);
        }

        #region 基础操作
        /// <summary>
        /// 取得所有角色
        /// </summary>
        /// <returns></returns>
        public static string[] GetAllRoles()
        {
            return Converter.ToList<string>(Do("getallroles")).ToArray();
        }
        /// <summary>
        /// 判断角色是否存在
        /// </summary>
        /// <param name="roleName">角色名</param>
        /// <returns></returns>
        public static bool RoleExists(string roleName)
        {
            return Do("roleexists", new[] 
            { 
                new QueryParameter("roleName", roleName) 
            }) == "1";
        }
        /// <summary>
        /// 获取一个指示指定用户是否属于指定角色的值。
        /// </summary>
        /// <param name="username">要搜索的用户名。</param>
        /// <param name="roleName">作为搜索范围的角色。</param>
        /// <returns>如果指定的用户名属于指定角色，则为 true；否则为 false。</returns>
        public static bool IsUserInRole(string username, string roleName)
        {
            return Do("isuserinrole", new[] 
            { 
                new QueryParameter("username", username),
                new QueryParameter("roleName", roleName) 
            }) == "1";
        }
        /// <summary>
        /// 获取属于指定角色的用户的列表。
        /// </summary>
        /// <param name="roleName">一个角色名称，将获取该角色的用户列表。</param>
        /// <returns>一个字符串数组，其中包含指定角色拥有的所有成员的用户名。</returns>
        public static string[] GetUsersInRole(string roleName)
        {
            return Converter.ToList<string>(Do("getusersinrole", new[] 
            { 
                new QueryParameter("roleName", roleName) 
            })).ToArray();
        }
        /// <summary>
        /// 获取一个用户所属角色的列表。
        /// </summary>
        /// <param name="username">要为其返回角色列表的用户。</param>
        /// <returns>一个字符串数组，其中包含指定用户所属的所有角色的名称。</returns>
        public static string[] GetRolesForUser(string username)
        {
            return Converter.ToList<string>(Do("getrolesforuser", new[] 
            { 
                new QueryParameter("username", username) 
            })).ToArray();
        }
        #endregion 基础操作


        #region 拓展操作
        /// <summary>
        /// 取得指定角色的信息
        /// </summary>
        /// <param name="roleName">角色名</param>
        /// <returns></returns>
        public static DiscuzRole GetRoleInfo(string roleName)
        {
            var infos = Converter.ToDict<string, string>(Do("getroleinfo", new[]{
                new QueryParameter("roleName",roleName)
            }));

            if (infos == null || infos.Count == 0) return null;

            try
            {
                return new DiscuzRole(infos["name"], infos["title"]);
            }
            catch (Exception ex)
            {
#if DEBUG
                throw ex;
#endif
            }
            return null;
        }
        #endregion 拓展操作
    }
}
